스프링이 개발자에게 제공하는 가장 큰 가치는 객체지향과 테스트이고,
복잡해지는 어플리케이션의 변화에 대응하는 전략은 객체지향적 설계와 IoC/DI 같은 기술과 함께
테스트기술이다.

테스트의 유용성

테스트란 코드가 정확히 동작하는지를 확인해서 만든 코드를 확실할 수 있게 해주는 작업이다. 결함을 제거(디버깅)하고 최종 테스트가 성공하면 모든 결함이 제거됐다는 확신을 얻을 수 있다.

UserDaoTest의 특징

main()메소드를 이용해 쉽게 테스트 수행을 가능하게 했고, 테스트할 대상인 UserDao를 직접 호출해서 사용한다.

웹을 통한 DAO 테스트 방법의 문제점

보통 웹 프로그램에서 사용하는 DAO 테스트 방법 - 서비스 계층, MVC 프레젠테이션 계층까지 포함한 모든 입출력 기능을 대충이라도 다 만든다. - 웹 어플리케이션을 서버에 배치한 뒤, 웹 화면을 띄워 폼을 열고, 값을 입력한 뒤 버튼을 눌러 등록해본다. - 입력한 데이터를 다시 가져올 수 있는 URL을 만들어 테스트 해본다.

이는 모든 레이어의 기능을 다 만들고 나서야 테스트가 가능하다는 큰 단점이 있다. 이는 오류가 있을 때 빠르고 정확하게 대응하기가 힘들다.

### 작은 단위의 테스트

테스트 또한 역시나, 관심사의 분리라는 원리를 적용하여 테스트의 관심이 다르다면 테스트할 대상을 분리하고 집중해서 접근해야 한다. 작은 단위의 코드에 대해 테스트를 수행하는 것을 단위테스트(Unit Test)라고 한다. 단위란 어느 정도인지 딱 정해진 것은 아니고, 충분히 하나의 관심에 집중해서 효율적으로 테스트할 만한 범위의 단위라고 보면 된다. 단위는 작을수록 좋지만 때로는 전 계층이 참여하는 길고 많은 단위의 테스트도 필요하다. 하지만 단위테스트 없이 긴 테스트만 하는 경우도 있는데, 이는 문제의 원인을 찾기가 매우 힘들어 질 것이다.

단위테스트를 하는 이유는 개발자가 설계하고 만든 코드가 원래 의도한 대로 동작하는지를 개발자 스스로 빨리 확인받기 위해서인데, 확인 대상과 조건이 간단하고 명확할 수록 좋으므로 작은 단위로 나눠서 하는 테스트가 필요하다.

결국 UserDaoTestUserDao라는 작은 단위의 데이터 액세스 기능만을 테스트하기 위해 만들어졌고, 그 외에 계층이 참여하지 않기 때문에 이는 분명 단위테스트다.

### 자동수행 테스트 코드

  • UserDaoTest는 자바클래스의 main()메소드를 실행하는 가장 간단한 방법만으로 테스트의 전 과정이 자동으로 진행된다.
  • 어플리케이션을 구성하는 클래스 안에 테스트 코드를 포함시키는 것보다는 별도로 테스트용 클래스를 만들어서 테스트 코드를 넣는 편이 낫다.
  • 자동으로 수행되는 테스트의 장점은 자주 반복할 수 있다는 것이다. 이는 빠른 수정과 빠른 확인을 가능하게 한다.

지속적인 개선과 점진적인 개발을 위한 테스트

일단 단순 무식한 방법으로 정상동작하는 코드를 만들고, 테스트를 만들어 두고 매우 작은 단계를 거쳐가면서 계속 코드를 개선해나간다. 작은 단계를 거치는 동안 테스트를 수행해서 확신을 가지고 코드를 변경해갔기 때문에 전체적으로 코드를 개선하는 작업에 속도가 붙고 더 쉬워질 수 있다. 또한 기능을 추가하려고 할 때도, 미리 만들어둔 테스트 코드는 유용하게 쓰일 수 있다. 기존에 만들어뒀던 기능들이 새로운 기능을 추가하느라 수정한 코드에 영향을 받지 않고 여전히 잘 동작하는지를 확인할 수도 있다.

UserDaoTest의 문제점

  • 수동 확인 작업의 번거로움
    값을 확인 하는 것은 결국 사람의 책임이다. 자동으로 진행을 해 주지만 완전히 자동으로 테스트되는 방법이라고 말할 수 없다.
  • 실행 작업의 번거로움
    아무리 간단히 실행 가능한 main()메소드라고 하더라도 매번 그것을 실행하는 것은 제일 번거롭다.
    그래서 좀 더 편리하고 체계적으로 테스트를 실행하고 그 결과를 확인하는 방법이 절실히 필요하다.